/*
 * @author Diego Bran
 * @author Miguel Zea
 * @author Eduardo Drummond
 * @author Javier García
 * @author Derek Orbaugh
 * 
 * | ======================================== |
 * |    Universidad Del Valle De Guatemala    |
 * | ======================================== |
 * | Algoritmos y Estructuras de Datos.       |
 * | Sección 20.                              | 
 * | Proyecto 1.                              |
 * | Descripción: servicio de venta de libros |
 * | usados, implementado mediante JavaFX 2.0 | 
 * | y MySQL para el soporte de persistencia. |
 * | ======================================== |
 */
package invapp;

/**
 * Se importan todos los paquetes requeridos por JavaFX y para la conexión a la
 * base de datos mySQL.
*/

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.geometry.HPos;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.stage.Popup;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.Priority;
import javax.swing.JScrollBar;

/**
 * Clase que utiliza la libreria de JavaFx para realizar la aplicación de venta
 * de libros usados.
 */
public class InvApp extends Application {

    @Override
    @SuppressWarnings("empty-statement")
    /*
     * Pre: ninguna.
     * Post: se inicia una instancia de la aplicacion web de servicio de venta
     * de libros usados.
     */
    public void start(Stage primaryStage) throws SQLException {
      
        // Se invoca al panel donde esta contenida la aplicacion.
        StackPane root = new StackPane();
        root.getChildren();
       
        Scene scene = new Scene(root, 410, 250);

        primaryStage.setTitle("Libreria Virtual");
        
        primaryStage.setScene(scene);
        primaryStage.show();

        GridPane gridpane = new GridPane();

        /* 
         * Se declaran las variables del programa, incluidas estan las etiquetas,
         * campos de texto y botones de la ventana de busqueda de libros y de la
         * del formulario de ingreso de libros.
         */
        gridpane.setHgap(11);
        gridpane.setVgap(11);
        Label space = new Label("");
   
        final TextField desplegar1 = new TextField();
        final TextArea desplegarTexto = new TextArea();
        Button busquedaButt = new Button("Busqueda Libros");
        Button displayButt = new Button("Busqueda de Libros");
        Button NuevaVentana = new Button("Formulario de Ingreso de Libros");
        desplegarTexto.setEditable(false);
        desplegarTexto.setPrefSize(350, 50);
       
        NuevaVentana.setOnAction(new EventHandler<ActionEvent>() {
    
        final TextField autor = new TextField();
        final TextField edicion = new TextField();
        final TextField nombre = new TextField();
        final TextField year = new TextField();
        final TextField estado = new TextField();
        final TextField precio = new TextField();
        final TextField curso = new TextField();
        final TextField profesor = new TextField();
        Label autor1 = new Label(" Autor");
        Label edicion1 = new Label(" Edicion");
        Label nombre1 = new Label(" Nombre");
        Label year1 = new Label(" Año");
        Label estado1 = new Label(" Estado");
        Label precio1 = new Label(" Precio");
        Label curso1 = new Label(" Curso");
        Label profesor1 = new Label(" Contacto");
        Button saveButt = new Button("Guardar");
        
        /**
         * Manejador de eventos para el boton que invoca al formulario de ingreso
         * de nuevos libros a la base de datos.
         * Pre: ninguna.
         * Post: se crea una nueva ventana que continene los campos y  elementos
         * correspondientes al formulario de ingreso de libro nuevo a la base de
         * datos.
         */
        public void handle(ActionEvent event) { 
      
            Stage secondaryStage = new Stage(StageStyle.UTILITY);
           
            // Se invoca al panel donde esta contenida toda la informacion.   
            StackPane root = new StackPane();
            root.getChildren();

            Scene scene = new Scene(root, 410, 250);

            secondaryStage.setTitle("Ingresar libro a la libreria virtual");
            secondaryStage.setScene(scene);
            secondaryStage.show();
            GridPane gridpane = new GridPane();
            GridPane.setHalignment(autor, HPos.RIGHT);
            gridpane.add(autor, 0, 0);
            GridPane.setHalignment(edicion, HPos.RIGHT);
            gridpane.add(edicion, 0, 1);
            GridPane.setHalignment(nombre, HPos.RIGHT);
            gridpane.add(nombre, 0, 2);
            GridPane.setHalignment(year, HPos.RIGHT);
            gridpane.add(year, 0, 3);
            GridPane.setHalignment(estado, HPos.RIGHT);
            gridpane.add(estado, 0, 4);
            GridPane.setHalignment(precio, HPos.RIGHT);
            gridpane.add(precio, 0, 5);
            GridPane.setHalignment(curso, HPos.RIGHT);
            gridpane.add(curso, 0, 6);
            GridPane.setHalignment(profesor, HPos.RIGHT);
            gridpane.add(profesor, 0, 7);
            GridPane.setHalignment(autor1, HPos.LEFT);
            gridpane.add(autor1, 1, 0);
            GridPane.setHalignment(edicion1, HPos.LEFT);
            gridpane.add(edicion1, 1, 1);
            GridPane.setHalignment(nombre1, HPos.LEFT);
            gridpane.add(nombre1, 1, 2);
            GridPane.setHalignment(year1, HPos.LEFT);
            gridpane.add(year1, 1, 3);
            GridPane.setHalignment(estado1, HPos.LEFT);
            gridpane.add(estado1, 1, 4);
            GridPane.setHalignment(precio1, HPos.LEFT);
            gridpane.add(precio1, 1, 5);
            GridPane.setHalignment(curso1, HPos.LEFT);
            gridpane.add(curso1, 1, 6);
            GridPane.setHalignment(profesor1, HPos.LEFT);
            gridpane.add(profesor1, 1, 7);
            GridPane.setHalignment(saveButt, HPos.LEFT);
            gridpane.add(saveButt, 2, 8);
            root.getChildren().add(gridpane);
          
            // Se crea el actionPerformed para boton de ingresar nuevo libro a la base de datos.
            saveButt.setOnAction(new EventHandler<ActionEvent>() {
                private String autor2;
                private String edicion2;
                private String nombre2;
                private String year2; 
                private String estado2;
                private String precio2;
                private String curso2;
                private String profesor2; 
            
                @Override
                /**
                 * Manejador de eventos para el boton de guardar nuevo libro, 
                 * contenido en el formulario de ingreso de libros.
                 * Pre: debe haber ocurrido el evento de acción del boton de
                 * invocacion del formulario.
                 * Post: se ingresa a la base de datos una nueva fila de información
                 * comprendida por el nombre, autor, edicion, año, estado, precio, curso
                 * y contacto del libro descrito en el formulario de ingreso.
                 */
                public void handle(ActionEvent event) {
                    // Se obtiene la informacion de los campos del formulario.
                    autor2 = autor.getText();
                    edicion2 = edicion.getText();
                    nombre2 = nombre.getText();
                    year2 = year.getText();
                    estado2 = estado.getText();
                    precio2 = precio.getText();
                    curso2 = curso.getText();
                    profesor2 = profesor.getText(); 
                
                    try {
                        Connection c = null;
                        Statement stmt = null;
                        
                        // Se realiza la conexion con la base de datos.
                        c = DBConnect.connect(); 
                        stmt = c.createStatement();
                        String sql;
                        
                        // Se define la sentencia a ser ejecutada por la base de datos.
                        sql = ("INSERT INTO test.Libreria (Autor , Edicion , Nombre, Año, Estado , Precio , Curso, Profesor) values ('"+autor2+"','"+edicion2+"','"+nombre2+"','"+year2+"','"+estado2+"','"+precio2+"','"+curso2+"','"+profesor2+"')");
                        
                        System.out.println(sql); // Utilizado para depuracion.
                        
                        /* 
                         * Se ejecuta la sentencia, en este caso se ingresa una nueva 
                         * fila en la tabla denominada libreria de la base de datos
                         * de nombre test, la cual contenga la informacion de todos los
                         * campos presentes en el formulario de ingreso de libros.
                         */
                        int rs = stmt.executeUpdate(sql);  
                        
                        // Se cierran las conexiones con la base de datos.
                        stmt.close();
                        c.close();

                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                }
            });
          
        }
       
    });


        // Se crea el actionPerformed para boton de desplegar resultado de busqueda.
        displayButt.setOnAction(new EventHandler<ActionEvent>() {
            private String variable1;

            /**
             * Manejador de eventos para el boton de busqueda de libros, contenido 
             * en el panel principal de la aplicacion..
             * Pre: ninguna.
             * Post: se despliega en un cuadro de texto la informacion de todos los
             * libros cuyo nombre sea similar al ingresado como parametro de busqueda,
             * luego de accesar a la base de datos.
             */
            @Override
            public void handle(ActionEvent event) {
                variable1=  desplegar1.getText();   
                try {
                    Connection c = null;
                    Statement stmt = null;
                    
                    // Se realiza la conexion con la base de datos.
                    c = DBConnect.connect();
                    stmt = c.createStatement();
                    
                    // Se define la sentencia a ser ejecutada por la base de datos.
                    String sql;
                    sql = ("select *  from test.Libreria where Nombre like '%"+variable1+"%'");

                    System.out.println(sql); // Utilizado para depuracion.
                    
                    /* 
                     * Se ejecuta la sentencia, en este caso se solicita a la base 
                     * de datos que devuelva todas las filas cuyo campo "nombre" sea
                     * similar al parametro de busqueda ingresado en el panel
                     * principal de la aplicacion.
                     */
                    ResultSet rs = stmt.executeQuery(sql);

                    desplegarTexto.setText(""); // Se limpia el bloque de texto.

                    // Se recorren todos los elementos retornados por la base de datos.
                    while (rs.next()) {
                        // Extraccion de datos por nombre de columna
                          
                        /* 
                         * Se obtinenen el Autor , Edicion , Nombre, Año, Estado , Precio , Curso, Contacto
                         * de cada una de las filas.
                         */
                        String Autor = rs.getString("Autor");
                        String Edit = rs.getString("Edicion");
                        String Name = rs.getString("Nombre");
                        String An = rs.getString("Año");
                        String est = rs.getString("Estado");
                        String price = rs.getString("Precio");
                        String curso = rs.getString("Curso");
                        String prof = rs.getString("Profesor");
                                
                        /* 
                         *Se despliega la informacion obtenida en la caja de texto
                         * ubicada al centro del panel principal de la aplicacion.
                         */
                        desplegarTexto.appendText("Nombre: "+Name+"\nAutor: "+Autor+"\nEdicion: "+Edit+"\nAño: "+ An+"\nEstado: "+
                        est+"\nPrecio: Q. " + price + "\nCurso: " + curso + "\nContacto: "+prof+"\n\n");
                        
                        // Se despliega la informacion en la consola con fines depuracion
                        System.out.println("Autor: "+Autor+" Edicion: "+Edit+" Nombre: "+Name+ " Año: "+ An+" Estado: "+
                        est+" Precio: " + price + " Curso: " + curso + " Contacto: "+prof);
                    }
                
                    // Se cierran las conexiones con la base de datos.
                    rs.close();
                    stmt.close();
                    c.close();

                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }

            }
        });



        // Crea espacio en blanco. 
        GridPane.setHalignment(space, HPos.RIGHT);
        gridpane.add(space, 0, 0);

        GridPane.setHalignment(desplegar1, HPos.LEFT);
        gridpane.add(desplegar1, 1, 1);
       
        // Caja de despliegue de texto 2.
        GridPane.setHalignment(desplegarTexto, HPos.CENTER);
        gridpane.add(desplegarTexto, 1, 3);
        
        GridPane.setHalignment(NuevaVentana, HPos.RIGHT);
        gridpane.add(NuevaVentana, 1, 4);
        GridPane.setHalignment(displayButt, HPos.RIGHT);
        gridpane.add(displayButt, 1, 5);
        
        root.getChildren().add(gridpane);

    }

}
